package com.hqq.persistence_tier.dao;

import java.util.Optional;
import java.util.stream.Stream;

/**
 * CustomerDao
 * 数据访问对象DAO是数据访问层的一部分.它是一个提供了一些持久访问机制的接口
 * 通过对应用层调用到持久层的映射,Dao提供了一些特殊的数据操作方法,调用者只需调用而无需知道数据库内部细节
 * Created by heqianqian on 2017/8/9.
 */
public interface CustomerDao {

    /**
     * @return 所有Customer的流对象 依赖于不同的实现该对象流的[惰性求值]或者[及早求值]
     * @throws Exception 执行中可能抛出的异常
     * ps:惰性求值:只描述Stream最后不产生集合的方式是惰性求值
     * 及早求值:最终会从Stream中产生值的情况叫做及早求值
     */
    Stream<Customer> getAll() throws Exception;

    /**
     * @param id 唯一的用户id
     * @return 存在返回Customer对象 否则返回null
     * @throws Exception 执行中可能抛出的异常
     */
    Optional<Customer> getById(int id) throws Exception;

    /**
     * @param customer 要添加的Customer对象
     * @return 是否成功添加
     * @throws Exception 执行中可能抛出的异常
     */
    boolean add(Customer customer) throws  Exception;

    /**
     * @param customer 要修改的Customer对象
     * @return 是否成功添加
     * @throws Exception 执行中可能抛出的异常
     */
    boolean update(Customer customer) throws  Exception;

    /**
     * @param customer 要删除的Customer对象
     * @return 是否成功添加
     * @throws Exception 执行中可能抛出的异常
     */
    boolean delete(Customer customer) throws  Exception;
}
